local redisKey = KEYS[1] -- 要进行限流的Key
local max_bucket_cap = tonumber(ARGV[1]) -- 桶最大容量
local rate = tonumber(ARGV[2]) --漏桶的流出速率（单位：秒）
local now = tonumber(ARGV[3]) --当前请求时间戳
local expire_seconds = 60 * 10  -- key存活时间,10分钟
local result = 1  -- 返回结果 1:成功, 0:失败

-- 查询上次请求的时间和桶已储水量
local limiter_info = redis.pcall("HMGET", redisKey, "last_time", "water")
local last_time = tonumber(limiter_info[1]) or 0
local last_water = tonumber(limiter_info[2]) or 0

-- 计算经过的时间(秒)
local delta_time = (now - last_time) / 1000
local current_water = math.max(0, last_water - delta_time * rate)  -- 漏水后剩余的储水量

-- 漏桶未满, 允许请求
if current_water < max_bucket_cap then
    current_water = current_water + 1
else
    result = 0 -- 漏桶已满, 请求被限流
end

redis.call("HMSET", redisKey, "water", current_water, "last_time", now)
redis.call("expire", redisKey, expire_seconds)
return result
